#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef struct SListNode
{
    int data;
    struct SListNode* next;
} SLTNode;

typedef int SLTDatatype;

void SLTPrint(SLTNode* phead)
{
    SLTNode* pcur= phead;
    while(pcur)
    {
        printf("%d->",pcur->data);
        pcur=pcur->next;
    }
    printf("NULL\n");
}

SLTNode* SLTBuyNode(SLTDatatype x)
{
    SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
    if(newnode==NULL)
    {   printf("失败");
        exit(1);
    }
    newnode->data=x;
    newnode->next=NULL;
    return newnode;
}

void SLTPushBack(SLTNode** pphead,SLTDatatype x)
{
    assert(pphead);

    SLTNode*newnode=SLTBuyNode(x);
    if(*pphead==NULL)
    {
        *pphead=newnode;
    }
    else
    {
        SLTNode* ptail =*pphead;
        while(ptail->next)
        {
            ptail=ptail->next;
        }
        ptail->next=newnode;

    }

}
//头插
void SLTPushFront(SLTNode** pphead,SLTDatatype x)
{
    assert(pphead);
    SLTNode* newnode=SLTBuyNode(x);
    if(pphead==NULL)
    {
        pphead=newnode;
    }
    newnode->next=*pphead;
    *pphead=newnode;
}

void SLTPopBack(SLTNode** pphead)
{
    assert(pphead && *pphead);
    if((*pphead)->next == NULL)
    {free(*pphead);
     *pphead=NULL;
    }
    else
    {
        SLTNode* prev =*pphead;
        SLTNode* ptail=*pphead;
        while(ptail->next)
        {  prev=ptail;
           ptail=ptail->next;
        }
        free(ptail);
        ptail=NULL;
        prev->next=NULL;
    }
       
}

void SLTPopFront(SLTNode**pphead)
{
    assert(pphead && *pphead);
    if((*pphead)->next == NULL)
    {free(*pphead);
     *pphead=NULL;
    }
    else
    {
        SLTNode* prev=(*pphead)->next;
        free(*pphead);
        *pphead=prev;
        
        
        
    }
    
}

void SLTTest()
{
    SLTNode* sl=NULL;
    SLTPushBack(&sl,1);
    SLTPushBack(&sl,2);
    SLTPushBack(&sl,3);
    SLTPrint(sl);

}

int main()
{
    SLTTest();

    return 0;
}